"""
流式输出功能接口
支持LLM流式生成文本
"""
from typing import Dict, Any, List, Optional, Generator, Set, ClassVar
from .base import Capability, register_capability

@register_capability("streaming")
class StreamingCapability(Capability):
	"""流式输出功能组件接口"""
	
	# 依赖的能力
	dependencies: ClassVar[Set[str]] = set()
	
	def _initialize(self) -> None:
		"""初始化流式能力"""
		super()._initialize()
		# 特定初始化代码可以添加在这里
	
	def is_supported(self) -> bool:
		"""
		判断当前提供商和模型是否支持流式输出
		
		Returns:
			是否支持
		"""
		# 默认实现，子类可以重写提供更精确的检测
		return True
	
	def stream_response(self, messages: List[Dict[str, Any]], **kwargs) -> Generator[str, None, None]:
		"""
		生成流式响应
		
		Args:
			messages: 消息列表
			**kwargs: 额外的提供商特定参数
			
		Returns:
			字符串流生成器
		"""
		raise NotImplementedError("必须由具体实现类实现")
	
	def process_chunk(self, chunk: Dict[str, Any]) -> Optional[str]:
		"""
		处理单个响应数据块
		
		Args:
			chunk: 响应数据块
			
		Returns:
			处理后的文本，如果数据块不包含文本则返回None
		"""
		raise NotImplementedError("必须由具体实现类实现")
		
	def detect_finish_reason(self, chunk: Dict[str, Any]) -> Optional[str]:
		"""
		检测数据块中的完成原因
		
		Args:
			chunk: 响应数据块
			
		Returns:
			完成原因，如果数据块不包含完成原因则返回None
		"""
		raise NotImplementedError("必须由具体实现类实现")
	
	def detect_tool_calls(self, chunk: Dict[str, Any]) -> Optional[List[Dict[str, Any]]]:
		"""
		检测数据块中是否包含工具调用
		
		Args:
			chunk: 响应数据块
			
		Returns:
			工具调用列表，如果没有则返回None
		"""
		# 默认实现，可由子类覆盖
		return None
		
	def handle_streamed_tool_calls(self, 
								 tool_calls: List[Dict[str, Any]]) -> Generator[str, None, None]:
		"""
		处理流式输出中的工具调用
		
		Args:
			tool_calls: 工具调用列表
			
		Returns:
			工具执行结果流
		"""
		# 检查是否有工具调用功能
		if not self.provider.has_capability("tool_calls"):
			return
			
		tool_call_capability = self.provider.get_capability("tool_calls")
		
		# 执行工具调用
		results = tool_call_capability.execute_tool_calls(tool_calls)
		
		# 处理结果
		for result in results:
			yield f"\n[工具调用: {result.get('name')}] {result.get('content')}"
